﻿using System;
using System.Collections.Generic;
using System.IO;
using GameStateManagement;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using SuperRyoninRPG.Controller;

namespace SuperRyoninRPG.Main
{
	public class StageScreen : GameScreen
	{
		private ContentManager content;
		private SpriteFont gameFont;
		private Stage stage;
		private int stageIndex;
		private int stageSubIndex = 1;
		private bool wasContinuePressed;
		private Dictionary<string, Texture2D> texture2Ds;

		// 入力ステートを各フレーム毎にポーリングし、必要に応じてステート情報を使用します。
		private GamePadState gamePadState;
		private KeyboardState keyboardState;
		private TouchCollection touchState;
		private AccelerometerState accelerometerState;

		public StageScreen()
		{
		}

		/// <summary>
		///     ゲームのグラフィック コンテンツを読み込みます。
		/// </summary>
		public override void LoadContent()
		{
			if (this.content == null)
			{
				this.content = new ContentManager(this.ScreenManager.Game.Services, "Content");
			}
			this.texture2Ds = new Dictionary<string, Texture2D>();

			this.gameFont = this.content.Load<SpriteFont>("gamefont");

			// 実際のゲームには、おそらくこのサンプルよりも多くのコンテンツが
			// 含まれているので、読み込みに長時間かかる場合があります。
			// ここでは、すばらしいローディング画面を
			// 観賞する機会を提供するために、少しゆっくりとシミュレートします。

			// 読み込みが終了したら、ResetElapsedTime を使用して、非常に長い
			// フレームを終了し、キャッチアップしようとしないように、
			// ゲームのタイミング メカニズムに指示する必要があります。
			this.ScreenManager.Game.ResetElapsedTime();
			this.LoadNextLevel();
		}

		private void LoadNextLevel()
		{
			// 次のステージに該当するインデックス値を設定します
			this.stageIndex = (this.stageIndex + 1);

			// 現在のステージ用のコンテンツを一度破棄してから、次のステージのコンテンツを読み込みます
			if (this.stage != null)
			{
				this.stage.Dispose();
			}

			// ステージを読み込みます
			string levelPath = string.Format("Content/stg/{0}-{1}.stg", this.stageIndex, this.stageSubIndex);
			using (Stream fileStream = TitleContainer.OpenStream(levelPath))
			{
				this.stage = new Stage(this.ScreenManager, fileStream, this.stageIndex);
			}
		}

		public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen)
		{
			// 対応しているすべての入力を取得します
			HandleInput();

			this.stage.Update(gameTime, keyboardState, gamePadState, touchState,
				accelerometerState, this.ScreenManager.Game.Window.CurrentOrientation);
			
			base.Update(gameTime,otherScreenHasFocus,coveredByOtherScreen);
		}

		private void HandleInput()
		{
			keyboardState = Keyboard.GetState();
			gamePadState = GamePad.GetState(PlayerIndex.One);
			touchState = TouchPanel.GetState();
			accelerometerState = Accelerometer.GetState();

			// [戻る] が押されたときにゲームを終了します。
			if (gamePadState.Buttons.Back == ButtonState.Pressed)
				this.ScreenManager.Game.Exit();

			bool continuePressed =
				keyboardState.IsKeyDown(Keys.Space) ||
				gamePadState.IsButtonDown(Buttons.A) ||
				touchState.AnyTouch();

			// 適切なアクションを実行して、ゲームを進め、
			// プレイヤーを再度プレイさせます。
			if (!wasContinuePressed && continuePressed)
			{
				if (!stage.Player.IsAlive)
				{
					stage.StartNewLife();
				}
				else if (stage.TimeRemaining == TimeSpan.Zero)
				{
					if (stage.ReachedExit)
						LoadNextLevel();
					else
						ReloadCurrentLevel();
				}
			}

			wasContinuePressed = continuePressed;
		}

		private void ReloadCurrentLevel()
		{
			--stageIndex;
			LoadNextLevel();
		}

		public override void Draw(GameTime gameTime)
		{
			// プレイヤーと敵は実際にはどちらもテキスト文字列です。
			ScreenManager screenManager = this.ScreenManager;
			SpriteBatch spriteBatch = screenManager.SpriteBatch;


			screenManager.GraphicsDevice.Clear(ClearOptions.Target,
											  Color.CornflowerBlue, 0, 0);



			Viewport viewport = this.ScreenManager.GraphicsDevice.Viewport;
			var fullscreen = new Rectangle(0, 0, viewport.Width, viewport.Height);
			int blockXCount = 16;
			int blockYCount = 14;
			int blockWidth = viewport.Width / blockXCount;
			int blockHeight = viewport.Height / blockYCount;

			spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, this.ScreenManager.GetScreenScale());
			this.stage.Draw(gameTime, spriteBatch);

			//DrawHud();
			spriteBatch.End();
		}
	}
}